﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;

namespace PractiseThread
{
    [AttributeUsage(AttributeTargets.Class |
        AttributeTargets.Constructor|
        AttributeTargets.Field|
        AttributeTargets.Method|
        AttributeTargets.Property,
        AllowMultiple = true)]
    class DeBugInfo : System.Attribute
    {
        private int bugNo;
        private string developer;
        private string lastReview;
        public string message;

        public DeBugInfo(int bg,string dev,string d)
        {
            this.bugNo = bg;
            this.developer = dev;
            this.lastReview = d;
        }

        public int BugNo
        {
            get
            {
                return bugNo;
            }
        }

        public string Developer
        {
            get
            {
                return developer;
            }
        }

        public string LastReview
        {
            get
            {
                return lastReview;
            }
        }

        public string Message
        {
            get
            {
                return lastReview;
            }
            set
            {
                message = value;
            }
        }
    }

    [DeBugInfo(45,"ZaraAli","12/8/2012",
        Message ="Return type mismatch")]
    [DeBugInfo(49,"Nuha Ali","10/10/2012",
        Message ="Unused variable")]

    class Rectangle
    {
        protected double length;
        protected double width;
        public Rectangle(double l,double w)
        {
            length = l;
            width = w;
        }

        [DeBugInfo(55,"Zara Ali","19/10/2012",
            Message = "Return type mismatch")]
        public double GetArea()
        {
            return length * width;
        }

        [DeBugInfo(56,"Zara Ali","19/10/2012")]
        public void Display()
        {
            Console.WriteLine("Length: {0}", length);
            Console.WriteLine("width:{0}", width);
            Console.WriteLine("Area:{0}", GetArea());
        }

        class ExecuteRectangle
        {
            static void Main(string[] args)
            {
                Rectangle r = new Rectangle(4.5, 7.5);
                r.Display();
                Type type = typeof(Rectangle);
                foreach(Object attributes in type.GetCustomAttributes(false))
                {
                    DeBugInfo dbi = (DeBugInfo)attributes;
                    if(null != dbi)
                    {
                        Console.WriteLine("Bug no:{0}", dbi.BugNo);
                        Console.WriteLine("Developer:{0}", dbi.Developer);
                        Console.WriteLine("Last Reviewed:{0}", dbi.LastReview);
                        Console.WriteLine("Remarks:{0}", dbi.Message);
                    }
                }

                foreach(MethodInfo m in type.GetMethods())
                {
                    foreach(Attribute a in m.GetCustomAttributes(true))
                    {
                        DeBugInfo dbi = a as DeBugInfo;
                        if(null != dbi)
                        {
                            Console.WriteLine("Bug no:{0}, for Method:{1}",
                                dbi.BugNo, m.Name);
                            Console.WriteLine("Developer:{0}", dbi.Developer);
                            Console.WriteLine("Last Reviewed:{0}", dbi.LastReview);
                            Console.WriteLine("Remarks:{0}", dbi.Message);
                        }
                    }
                }
                Console.ReadLine();
            }
        }
    }
}
